﻿using System;
using System.Collections.Generic;
using System.Text;
using ClassLibraryEntidades;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;
using System.Configuration;
using System.Globalization;
using ClassLibraryEntidades.ExceptionsServer;


namespace ClassLibraryServer.Negocio
{
    public class AlgoritmoRutaExpress : CalculoRuta
    {

        private static Dictionary<string, Ruta> diccionarioBusqueda;

        public string pathFichero = String.Empty;

        public AlgoritmoRutaExpress()
        {
            ObtenerTablaRutasBusqueda();
        }

        public AlgoritmoRutaExpress(string pathFichero)
        {
            this.pathFichero = pathFichero;
            ObtenerTablaRutasBusqueda();
        }


        public override Ruta CalcularRuta(BusquedaNatural busqueda)
        {
            Direccion origen = busqueda.origen;
            Direccion destino = busqueda.destino;


            string calle_origen, calle_destino;

            calle_origen = FormatearCalle(origen.calle);
            calle_destino = FormatearCalle(destino.calle);
            
            string key_busqueda = busqueda.TipoRuta.ToString()+calle_origen + origen.numero + 
                                                               calle_destino + destino.numero;

            if (!diccionarioBusqueda.ContainsKey(key_busqueda))
                throw new ExceptionRutaNoEncontrada("La ruta solicitada no existe");

            Ruta ruta = diccionarioBusqueda[key_busqueda];

            return ruta;
        }

        /// <summary>
        /// Le quita los acentos al string
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        private string FormatearCalle(string p)
        {
            String normalizedString = p.Normalize(NormalizationForm.FormD);
            StringBuilder stringBuilder = new StringBuilder();

            for (int i = 0; i < normalizedString.Length; i++)
            {
                Char c = normalizedString[i];

                if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
                    stringBuilder.Append(c);

            }
            return stringBuilder.ToString();
        }

        #region Métodos privados

        private void ObtenerTablaRutasBusqueda()
        {

            diccionarioBusqueda = Util.ObtenerRutasDesdeArchivo(pathFichero);


        }

        #endregion
    }
}